package ar.edu.utn.frgp.TPFinalBanco.action;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import org.hibernate.classic.Session;

import ar.edu.utn.frgp.TPFinalBanco.model.Cliente;
import ar.edu.utn.frgp.TPFinalBanco.model.Cuenta;
import ar.edu.utn.frgp.TPFinalBanco.model.EstadoCuentaEnum;
import ar.edu.utn.frgp.TPFinalBanco.model.TipoCuentaEnum;
import ar.edu.utn.frgp.TPFinalBanco.service.impl.GestionCuentaServiceImpl;
import com.opensymphony.xwork2.ActionContext;

public class CrearCuentaAction extends BaseAction {

	private static final long serialVersionUID = -4487081772280710306L;

	private Date ahora;
	private Boolean tiene;
	private String tipo;
	private String dni;
	private Cliente cliente;

	public String execute() throws Exception {

		GestionCuentaServiceImpl cuentaService = (GestionCuentaServiceImpl) getContext()
				.getBean("gestionCuentasService");

		Cliente clienteActual = (Cliente) ActionContext.getContext()
				.getSession().get("cliente");

	

		if (clienteActual != null) {
			if (tipo.equals(TipoCuentaEnum.CA.getCodigo())) {
				Boolean tieneCA = clienteActual.getTieneCA();
				if (tieneCA) {
					String errorMsg = String
							.format("No puede Poseer mas de 1 Caja de Ahorros");
					addActionError(errorMsg);
					return ERROR;
				}
			} else {
				Integer cantCC = clienteActual.getCantCC();
				if (cantCC >= 5) {
					String errorMsg = String
							.format("No puede Poseer mas de 5 Cuentas Corrientes");
					addActionError(errorMsg);
					
					return ERROR;
				}
			}
			
			
			// creamos la nueva Cuenta
			Cuenta cuenta = new Cuenta(EstadoCuentaEnum.H.name(),
					new BigDecimal(0), new BigDecimal(5000), clienteActual);

			if (tipo.equals(TipoCuentaEnum.CA.getCodigo())) {
				cuenta.setTipo(TipoCuentaEnum.CA);
			} else {
				cuenta.setTipo(TipoCuentaEnum.CC);
			}
			// lo guardamos en la BD
			cuentaService.saveCuenta(cuenta);

			// actualizamos los datos del usuario en sesión
			List<Cuenta> cuentas = clienteActual.getCuentas();
			cuentas.add(cuenta);
			clienteActual.setCuentas(cuentas);
			ActionContext.getContext().getSession()
					.put("cliente", clienteActual);
			setCliente(clienteActual);

			return SUCCESS;
		} else {
			String errorMsg = String.format(
					"El cliente con dni '%s' ya se encuentra registrado.", dni);
			addActionError(errorMsg);
			return ERROR;
		}

	}

	public String getTipo() {
		return tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	public String getDni() {
		return dni;
	}

	public void setDni(String dni) {
		this.dni = dni;
	}

	public Date getAhora() {
		return ahora;
	}

	public void setAhora(Date ahora) {
		this.ahora = ahora;
	}

	public Boolean getTiene() {
		return tiene;
	}

	public void setTiene(Boolean tiene) {
		this.tiene = tiene;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

}
